/**
 * @addtogroup eed
 * eed
 * @{
 */
/**
 * @file        eed.h
 * @brief       XXXX
 * @note        XXXX
 * @author      靳普诏(puzhao.jin@hopechart.com)
 * @date        2024/11/03
 * @version     1.0

 * @par         修改日志
 * <table>
 * <tr><th>Date         <th>Version     <th>Author      <th> Description
 * <tr><td>2024/11/03   <td>1.0         <td>靳普诏       <td> 创建初始版本
 * @copyright 杭州鸿泉物联网技术股份有限公司
 */

#ifndef _EED_H_
#define _EED_H_

#include "ofc/ofc_types.h"

#ifdef __cplusplus
extern "C"
{
#endif

typedef struct TEdbTag TEdb;

enum TEdbErrCodeTag
{
    kEdbErrCodeOK = 0,
    kEdbErrCodeFail = -1,
    kEdbErrCodeParamInval = -2,
    kEdbErrCodeNotWritten = -3,
    kEdbErrCodeNotEnoughLen = -4,
    kEdbErrCodeNotExist = -5,
    kEdbErrCodeNoMem = -6,
    kEdbErrCodeDidCfgError = -7,
};
typedef enum TEdbErrCodeTag TEdbErrCode;

enum TEdbDataTypeTag
{
    kEdbDataTypeBytes = 0x00,
    kEdbDataTypeU08 = 0x01,
    kEdbDataTypeU16 = 0x02,
    kEdbDataTypeU32 = 0x04,
    kEdbDataTypeU64 = 0x08,

    kEdbDataTypeMem = 0x80,
    kEdbDataTypeStr = 0x81,
};
typedef enum TEdbDataTypeTag TEdbDataType;



enum TEdbDataStateMaskTag
{
    kEdbDataStateMaskValueValid = (0x01 << 0),
    kEdbDataStateMaskValueChg = (0x01 << 1),
};
typedef enum TEdbDataStateMaskTag TEdbDataStateMask;


typedef struct TEdbDidStateTag TEdbDidState;
struct TEdbDidStateTag
{
    UInt32 chg_tick;
    UInt32 val_state; // bit位定义见 TEdbDataStateMask
};

// 数据id定义
typedef struct TEdbDidDefTag TEdbDidDef;
struct TEdbDidDefTag
{
    UInt16 did;
    UInt8  dlen;
    UInt8  dtype;  // 数据类型 @ref TEdbDataType
    UInt32 val_buff_offset;
};

typedef struct TEdbPlugTag TEdbPlug;

typedef void (*TEdbPlugOnExecCallback)(TEdb *sender, void *user_param);
typedef void (*TEdbPlugOnNotifyCallback)(TEdb *sender, void *user_param, UInt16 did);

struct TEdbPlugTag
{   
    void *user_param;
    TEdbPlugOnExecCallback OnInit;
    TEdbPlugOnExecCallback OnOpen;
    TEdbPlugOnExecCallback OnRunOnce;
    TEdbPlugOnExecCallback OnClose;
    TEdbPlugOnExecCallback OnDone;

    TEdbPlugOnNotifyCallback OnValueChange;
};



typedef struct TEdbCfgTag TEdbCfg;

typedef Bool (* TEdbCfgDoLock)(void *user_param);
typedef void (* TEdbCfgDoUnlock)(void *user_param);
typedef UInt32 (* TEdbCfgDoGetTickCount)(void *user_param);
typedef void (* TEdbCfgDoSleep)(void *user_param, UInt32 ms);

struct TEdbCfgTag
{
    const TEdbDidDef *did_def_table_ptr; // 数据id 定义表. 依赖工具生成
    UInt16 did_def_table_len;
    
    UInt16 plug_list_len;
    const TEdbPlug *plug_list;

    TEdbCfgDoLock   DoLock;
    TEdbCfgDoUnlock DoUnlock;
    TEdbCfgDoGetTickCount DoGetTickCount;
    TEdbCfgDoSleep DoSleep;
    void *cb_user_param;
};


struct TEdbTag
{
    const TEdbCfg *cfg_;
    UInt8 refcount_;

    TEdbDidState *state_buff_addr_; // 数据状态缓存地址
    UInt8 *value_buff_addr_; // 数据值缓存地址
    UInt8 *value_buff_end_; // 缓存地址结束位置
};


Int32 EdbInit(const TEdbCfg *cfg, void *ram_buff, Int32 ram_buff_size);
void  EdbDone();


Int32 EdbOpen();
void  EdbClose();

void  EdbRunOnce();


/**
 * 获取数据定义
 * @param did           数据id
 * @param *r_errcode    >= 0: 成功, 返回当前数据有效字节的长度;
 *                      < 0: 失败, 返回错误码.
 * @return  != NULL 数据定义结构体
 *          == NULL 失败
 * @note:xxxxx
 */
TEdbDidDef *EdbGetDidDef(UInt16 did, UInt8 *r_errcode);


/**
 * 获取原始数据值
 * @param did    [in]     数据id
 * @param *value [out]    数据值返回缓存地址
 * @param len    [in]     数据值缓存长度
 * @return >= 0: 成功, 返回当前数据有效字节的长度;
 *          < 0: 失败, 返回错误码.
 */
Int32 EdbGetValueBytes(UInt16 did, void *value, UInt32 len);

/**
 * 设置原始数据值
 * @param did    [in]     数据id
 * @param *value [in]    数据值缓存地址
 * @param len    [in]     数据值缓存长度
 * @return >= 0: 成功, 返回当前数据有效字节的长度;
 *          < 0: 失败, 返回错误码.
 */
Int32 EdbSetValueBytes(UInt16 did, const void *value, UInt32 len);


Int32 EdbGetValueU08(UInt16 did, UInt8 *value);
Int32 EdbSetValueU08(UInt16 did, UInt8 value);

Int32 EdbGetValueU16(UInt16 did, UInt16 *value);
Int32 EdbSetValueU16(UInt16 did, UInt16 value);

Int32 EdbGetValueU32(UInt16 did, UInt32 *value);
Int32 EdbSetValueU32(UInt16 did, UInt32 value);

Int32 EdbGetValueU64(UInt16 did, UInt64 *value);
Int32 EdbSetValueU64(UInt16 did, UInt64 value);



Int32 EdbGetValueStr(UInt16 did, char *value, UInt32 len);
Int32 EdbSetValueStr(UInt16 did, const char *value);

/**
 * 获取原始数据值
 * @param did    [in]     数据id
 * @param *value [out]    数据值返回缓存地址
 * @param len    [in]     数据值缓存长度
 * @return >= 0: 成功, 返回当前数据有效字节的长度;
 *          < 0: 失败, 返回错误码.
 */
Int32 EdbGetValueMem(UInt16 did, void *value, UInt32 len);

/**
 * 设置Mem类型值
 * @param did
 * @param *value
 * @param len
 * @return 
 * @note:xxxxx
 */
Int32 EdbSetValueMem(UInt16 did, const void *value, UInt32 len);

#ifdef __cplusplus
}  ///< extern "C"
#endif

#endif  ///< _EED_H_

/**
 * @}  Generated on "2024-11-03 16:52:00" by the tool "gen_hq_file.py >> V20231119" 
 */

